package leetcode008;

/**
 * 字符串转换整数 (atoi)
 * https://leetcode.cn/problems/string-to-integer-atoi/description/
 *
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 *
 * 函数 myAtoi(string s) 的算法如下：
 *
 * 1. 空格：读入字符串并丢弃无用的前导空格（" "）
 * 2. 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 3. 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 4. 舍入：如果整数数超过 32 位有符号整数范围 [−2的31次方,  2的31次方 − 1] ，需要截断这个整数，使其保持在这个范围内。
 *      具体来说，小于 −2的31次方 的整数应该被舍入为 −2的31次方 ，大于 2的31次方 − 1 的整数应该被舍入为 2的31次方 − 1 。
 * 返回整数作为最终结果。
 */
public class Study008 {


    public int myAtoi(String s) {
        char[] strs = s.toCharArray();
        int result = 0;
        boolean blankFlag = false, symbolFlag = false;
        int symbol = 1;
        for (int i = 0; i < strs.length; i++) {
            //前导空格处理
            if (!blankFlag) {
                if (strs[i] == ' '){
                    continue;
                } else {
                    blankFlag = true;
                }
            }
            //符号位处理
            if (!symbolFlag) {
                if (strs[i] == '-' || strs[i] == '+') {
                    if (strs[i] == '-') {
                        symbol = -1;
                    }
                    symbolFlag = true;
                    continue;
                } else {
                    symbolFlag = true;
                }
            }
            //过程中遇到非数字则截断直接返回
            if (strs[i] < '0' || strs[i] > '9') {
                break;
            }

            //转换处理
            int temp = Character.getNumericValue(strs[i]);
            //舍入
            if (symbol >= 0) {
                if (result > Integer.MAX_VALUE / 10 ||
                        (result == Integer.MAX_VALUE / 10 && temp >= Integer.MAX_VALUE % 10)) {
                    return Integer.MAX_VALUE;
                }
            } else if (-result < Integer.MIN_VALUE/ 10 ||
                    (-result == Integer.MIN_VALUE/10 && temp > -(Integer.MIN_VALUE% 10))) {
                return Integer.MIN_VALUE;
            }
            result = result * 10 + temp;
        }

        return result * symbol;
    }

    public static void main(String[] args) {
        Study008 study008 = new Study008();
        System.out.println(study008.myAtoi("+42"));
        System.out.println(study008.myAtoi("   -042"));
        System.out.println(study008.myAtoi("1337c0d3"));
        System.out.println(study008.myAtoi("0-1"));
        System.out.println(study008.myAtoi("-91283472332"));
        System.out.println(study008.myAtoi("-2147483647"));
        System.out.println(study008.myAtoi("2147483648"));

    }
}
